package com.me.study.javaCore.dynamicProxy.cglib;

import com.me.study.javaCore.dynamicProxy.PerformanceMonitor;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * CGLIB 动态代理: 增强逻辑
 *
 * @author ME
 * @date   2019/2/27 15:21
 */
public class CglibAdvice implements MethodInterceptor {

    /**
     * 拦截父类所有方法的调用，进行增强逻辑
     *
     * @param target    被代理的目标类
     * @param method    被代理的方法
     * @param parameterArray    被代理方法的参数列表，基本数据类型需要传入其包装类型，如int-->Integer、long-Long、double-->Double
     * @param methodProxy   CGlib 方法代理对象，invokeSuper方法表示对目标对象对应方法的调用
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object target, Method method, Object[] parameterArray, MethodProxy methodProxy) throws Throwable {
        // 假设 AOP 的增强初始化时，已经生成了 advice的Pointcut表达式 和 匹配的业务方法的对应关系：
        // 那么，就可以根据 业务方法名找到 advice，并根据 advice类型 执行增强逻辑。
        // 如：@Before 就先调用 advice方法，再调用业务方法
        PerformanceMonitor.begin(target.getClass().getName() + '.' + method.getName());
        Object result = methodProxy.invokeSuper(target, parameterArray);
        PerformanceMonitor.end();
        return result;
    }
}
